package com.java.yz.day08.fanhuizhiDemo;

/*
    返回值类型：
        基本类型：当基本数据类型作为方法返回值类型的时候，将来调用完方法需要返回具体类型的值
        引用类型：
            具体类：当你看到一个类作为方法返回值的类型的时候，将来方法中返回一个该类的对象或者该类的子类对象
            抽象类：当你看到一个抽象类作为方法返回值的类型的时候，将来方法中返回一个该抽象类的具体子类对象
            接口：当你看到一个接口作为方法返回值的类型的时候，将来方法中返回一个实现该接口的子类对象
 */
//具体类
class Teacher1{
    public void f1(){
        System.out.println("教书育人1");
    }
}
class Teacher11{
    public Teacher1 f11(){   //这里返回的是一个引用数据类型，就要返回它的对象
        return new Teacher1();
    }
}

//抽象类
abstract class Teacher2{
    public void f2(){
        System.out.println("教书育人2");
    }
}
class Teacher222 extends Teacher2{

}
class Teacher22{
    public Teacher2 f22(){
        //return new Teacher2();
        return new Teacher222();  //这里返回不了new Teacher2();所以只能自己创建一个子类继承
    }
}


//接口
interface Inter3 {
    void f3();
}
class Teacher333 implements Inter3{
    @Override
    public void f3() {
        System.out.println("教书育人3");
    }
}
class Teacher33{
    public Inter3 f33(){
        //return new Inter3();//这里返回不了new Teacher2();所以只能自己创建一个子类继承
        return new Teacher333();
    }
}
public class TeacherDemo1 {
    public static void main(String[] args) {
        //具体类的实现
        Teacher11 teacher11 = new Teacher11();
        Teacher1 t1=teacher11.f11();   //Teacher1 t1 = new Teacher1()
        t1.f1();
        // new Teacher11().f11().f1();  //链式调用

        //抽象类的实现
        Teacher22 teacher22 = new Teacher22();
        Teacher2 t2=teacher22.f22(); //Teacher2 t2=new Teacher222(); 抽象多态，编译看左，运行看右
        t2.f2();

        //接口的实现
        Teacher33 teacher33 = new Teacher33();
        Inter3 t3=teacher33.f33(); //Inter3 t3=new Teacher333(); 接口多态
        t3.f3();
        new Teacher33().f33().f3();  //链式编程，后面会学链式调用的  scala
        //链式调用可读性较差，但是代码简短
    }
}
